// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_ACCESSIBILITY_PLATFORM_AX_PLATFORM_NODE_BASE_H_
#define UI_ACCESSIBILITY_PLATFORM_AX_PLATFORM_NODE_BASE_H_

#include "base/macros.h"
#include "ui/accessibility/ax_enums.h"
#include "ui/accessibility/platform/ax_platform_node.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/native_widget_types.h"

namespace ui {

struct AXNodeData;
class AXPlatformNodeDelegate;

class AXPlatformNodeBase : public AXPlatformNode {
public:
    virtual void Init(AXPlatformNodeDelegate* delegate);

    // These are simple wrappers to our delegate.
    const AXNodeData& GetData() const;
    gfx::Rect GetBoundsInScreen() const;
    gfx::NativeViewAccessible GetParent();
    int GetChildCount();
    gfx::NativeViewAccessible ChildAtIndex(int index);

    // This needs to be implemented for each platform.
    virtual int GetIndexInParent() = 0;

    // AXPlatformNode.
    void Destroy() override;
    gfx::NativeViewAccessible GetNativeViewAccessible() override;
    AXPlatformNodeDelegate* GetDelegate() const override;

    // Helpers.
    AXPlatformNodeBase* GetPreviousSibling();
    AXPlatformNodeBase* GetNextSibling();
    bool IsDescendant(AXPlatformNodeBase* descendant);

    bool HasBoolAttribute(ui::AXBoolAttribute attr) const;
    bool GetBoolAttribute(ui::AXBoolAttribute attr) const;
    bool GetBoolAttribute(ui::AXBoolAttribute attr, bool* value) const;

    bool HasFloatAttribute(ui::AXFloatAttribute attr) const;
    float GetFloatAttribute(ui::AXFloatAttribute attr) const;
    bool GetFloatAttribute(ui::AXFloatAttribute attr, float* value) const;

    bool HasIntAttribute(ui::AXIntAttribute attribute) const;
    int GetIntAttribute(ui::AXIntAttribute attribute) const;
    bool GetIntAttribute(ui::AXIntAttribute attribute, int* value) const;

    bool HasStringAttribute(
        ui::AXStringAttribute attribute) const;
    const std::string& GetStringAttribute(ui::AXStringAttribute attribute) const;
    bool GetStringAttribute(ui::AXStringAttribute attribute,
        std::string* value) const;
    bool GetString16Attribute(ui::AXStringAttribute attribute,
        base::string16* value) const;
    base::string16 GetString16Attribute(
        ui::AXStringAttribute attribute) const;

    AXPlatformNodeDelegate* delegate_; // Weak. Owns this.

protected:
    AXPlatformNodeBase();
    ~AXPlatformNodeBase() override;

    // Cast a gfx::NativeViewAccessible to an AXPlatformNodeBase if it is one,
    // or return NULL if it's not an instance of this class.
    static AXPlatformNodeBase* FromNativeViewAccessible(
        gfx::NativeViewAccessible accessible);

private:
    DISALLOW_COPY_AND_ASSIGN(AXPlatformNodeBase);
};

} // namespace ui

#endif // UI_ACCESSIBILITY_PLATFORM_AX_PLATFORM_NODE_BASE_H_
